#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;
/**
 * 主函数，负责计算片段颜色
 * 该函数实现了一个天空渲染效果，包含太阳位置动画、米氏散射计算和颜色混合
 * 
 * 参数说明：
 * gl_FragCoord: 内置变量，当前片段的窗口坐标
 * u_resolution: 均匀变量，屏幕分辨率
 * u_time: 均匀变量，运行时间，用于动画计算
 * u_mouse: 均匀变量，鼠标位置坐标
 * 
 * 返回值说明：
 * gl_FragColor: 内置变量，设置当前片段的最终颜色
 */
void main() {
    // 计算归一化屏幕坐标，将屏幕坐标映射到[0,1]范围
    vec2 uv = gl_FragCoord.xy / u_resolution;

    // 动画控制：根据鼠标位置决定太阳位置的计算方式
    // 当鼠标x坐标小于20时，使用时间驱动的自动动画
    // 否则使用鼠标位置控制太阳位置
    vec2 sunVec;
    if(u_mouse.x < 20.0) {
        sunVec = vec2((0.8 + 0.5 * sin(u_time)), (0.44 + 0.4 * cos(2.0 * u_time)));
    } else {
        sunVec = u_mouse.xy / u_resolution.y;
    }

    // 米氏散射遮罩计算：模拟太阳周围的大气散射效果
    // 包含太阳本身亮度和天空渐变效果的组合计算
    float sun = max(1.0 - (1.0 + 10.0 * sunVec.y + 1.0 * uv.y) * length(uv - sunVec), 0.0) + 0.3 * pow(1.0 - uv.y, 12.0) * (1.6 - sunVec.y);

    // 核心颜色计算：混合天空和太阳颜色，应用光照和散射效果
    // 使用mix函数在两种基础颜色间插值，并应用多种光照因子增强视觉效果
    gl_FragColor = vec4(mix(vec3(0.3984, 0.5117, 0.7305), vec3(0.7031, 0.4687, 0.1055), sun) * ((0.5 + 1.0 * pow(sunVec.y, 0.4)) * (1.5 - uv.y) + pow(sun, 5.2) * sunVec.y * (5.0 + 15.0 * sunVec.y)), 1.0);

}